package com.library.utils.sms;

import org.springframework.stereotype.Component;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.net.URL;
import java.util.Date;
import java.util.Properties;

/**
 * @author weiwu
 * @description 电子邮件的工具类
 * @date 2018/10/6 21:00
 */
@Component
public class EmailUtils {
    public void sendEmail( String receiver, String content, String filePath ) throws Exception {

        // 发送者
        String from = "1163698309@qq.com";

        // 接收者
        String to = receiver;

        // 标题
        String subject = "图书管理系统";

        // 邮件主体内容
        //        String content = "发送带有附件的测试邮件！！！";

        // 邮件服务器的类型
        String smtpHost = "smtp.qq.com";// smtp.qq.com/smtp.sohu.com

        // 设置相关的属性
        Properties props = new Properties();

        // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.transport.protocol", "smtp");

        // 发件人的邮箱的 SMTP服务器地址
        props.setProperty("mail.smtp.host", smtpHost);

        // 请求认证，参数名称与具体实现有关
        props.setProperty("mail.smtp.auth", "true");

        // 创建Session实例对象
        Session session = Session.getDefaultInstance(props);

        // 创建MimeMessage实例对象
        MimeMessage message = new MimeMessage(session);

        // 设置发件人
        message.setFrom(new InternetAddress(from));

        // 设置收件人
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));

        // 设置发送日期
        message.setSentDate(new Date());

        // 设置邮件主题
        message.setSubject(subject);

        // 设置纯文本内容的邮件正文
        message.setText(content);

        // 设置发送的邮件的内容为html的格式
        Multipart multipart = new MimeMultipart();
        BodyPart html = new MimeBodyPart();
        html.setContent(content, "text/html;charset=utf-8");
        multipart.addBodyPart(html);
        message.setContent(multipart);

        //在邮件主题上带上附件（excel）
        BodyPart attachBody = new MimeBodyPart();

        //获得excel文件的路径
        String filepath = null;
        URL resource = null;
        if ( filePath != null ) {
            resource = this.getClass()
                           .getClassLoader()
                           .getResource(filePath);
            System.out.println();
            System.out.println();
            System.out.println("文件路径不为空！");
            System.out.println();
            System.out.println();
        }
        if ( resource != null ) {
            filepath = resource.getPath();
            if ( filepath != null ) {
                FileDataSource dataSource = new FileDataSource(filepath);

                attachBody.setDataHandler(new DataHandler(dataSource));

                //设置附件的文件名MimeUtility.encodeWord()可以避免文件名乱码
                attachBody.setFileName(MimeUtility.encodeWord(dataSource.getFile().getName()));

                //把附件插入到邮件主体中。
                multipart.addBodyPart(attachBody);
                message.setContent(multipart);
                System.out.println();
                System.out.println();
                System.out.println();
                System.out.println();
                System.out.println("发送附件！");
                System.out.println();
                System.out.println();
                System.out.println();
                System.out.println();

            }
        }

        // 保存并生成最终的邮件内容
        message.saveChanges();

        // 设置为debug模式, 可以查看详细的发送 log
        session.setDebug(true);

        // 获取Transport对象
        Transport transport = session.getTransport("smtp");

        // 第2个参数需要填写的是QQ邮箱的SMTP的授权码，什么是授权码，它又是如何设置？
        transport.connect(from, "osotlyzlohonifib");

        // 发送，message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }
}
